/*
将一个按照升序排列的有序数组，转换为一棵高度平衡二叉搜索树。

本题中，一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定有序数组: [-10,-3,0,5,9],

一个可能的答案是：[0,-3,9,-10,null,5]，它可以表示下面这个高度平衡二叉搜索树：

      0
     / \
   -3   9
   /   /
 -10  5

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
private:
    bool DEBUG=false;
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        int size=nums.size();
        if(size==0){
            return NULL;
        }
        TreeNode* root =new TreeNode(nums[size/2]);
        half(root,nums,0,size/2-1,true);
        half(root,nums,size/2+1,size-1,false);
        cout<<"COMPLETE!"<<endl;
        return root;
    }
    void half(TreeNode* root,vector<int>& nums,int left,int right,bool lr){
        if(left<right){
            if (DEBUG){
                cout<<"left<right,left="<<left<<",right="<<right<<",root="<<root->val;
            }
            int mid_pos=(left+right)/2;
            TreeNode* mid=new TreeNode(nums[mid_pos]);
            if(DEBUG){
                cout<<(lr?",root->left=":",root->right=")<<mid->val<<endl;
            }
            lr?root->left=mid:root->right=mid;
            half(mid,nums,left,mid_pos-1,true);
            half(mid,nums,mid_pos+1,right,false);
        }else if(left==right){
            if (DEBUG){
                cout<<"left=right="<<left<<",root="<<root->val<<endl;
            }
            TreeNode* node=new TreeNode(nums[left]);
            lr?root->left=node:root->right=node;
        }else{
            if(DEBUG){
                cout<<"left>right,left="<<left<<",right="<<right<<",pass"<<endl;
            }
        }
    }
};
//-10,-9,-8,-7,-5,-3,0,5,6,7,8,9
//                 0
//        -8              7
//     -9    -5        6     8
//  -10   -7    -3   5          9
//

//2020.6.23 town 简洁版

class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return half(nums,0,nums.size()-1);
    }
    TreeNode* half(vector<int>& nums,int i,int j){
        if(i>j){
            return NULL;
        }
        int mid=(i+j)/2;
        TreeNode* mid_node=new TreeNode(nums[mid]);
        mid_node->left=half(nums,i,mid-1);
        mid_node->right=half(nums,mid+1,j);
        return mid_node;
    }
};